package com.insight.common.enums;

import lombok.Getter;

/**
 * T013: 数据库类型枚举
 * 支持6种主流数据库
 */
@Getter
public enum DatabaseType {

    /**
     * Oracle 数据库
     */
    ORACLE("Oracle", "oracle.jdbc.OracleDriver", 1521),

    /**
     * MySQL 数据库
     */
    MYSQL("MySQL", "com.mysql.cj.jdbc.Driver", 3306),

    /**
     * Microsoft SQL Server 数据库
     */
    SQL_SERVER("SQL Server", "com.microsoft.sqlserver.jdbc.SQLServerDriver", 1433),

    /**
     * PostgreSQL 数据库
     */
    POSTGRESQL("PostgreSQL", "org.postgresql.Driver", 5432),

    /**
     * TiDB 数据库 (兼容MySQL协议)
     */
    TIDB("TiDB", "com.mysql.cj.jdbc.Driver", 4000),

    /**
     * 达梦数据库
     */
    DAMENG("DaMeng", "dm.jdbc.driver.DmDriver", 5236);

    /**
     * 数据库显示名称
     */
    private final String displayName;

    /**
     * JDBC 驱动类名
     */
    private final String driverClassName;

    /**
     * 默认端口
     */
    private final int defaultPort;

    DatabaseType(String displayName, String driverClassName, int defaultPort) {
        this.displayName = displayName;
        this.driverClassName = driverClassName;
        this.defaultPort = defaultPort;
    }

    /**
     * 根据名称获取数据库类型
     *
     * @param name 数据库类型名称
     * @return 数据库类型枚举
     * @throws IllegalArgumentException 如果名称不匹配任何数据库类型
     */
    public static DatabaseType fromName(String name) {
        for (DatabaseType type : values()) {
            if (type.name().equalsIgnoreCase(name) || type.displayName.equalsIgnoreCase(name)) {
                return type;
            }
        }
        throw new IllegalArgumentException("Unknown database type: " + name);
    }

    /**
     * 构建JDBC URL
     *
     * @param host     数据库主机地址
     * @param port     端口号
     * @param database 数据库名称
     * @return JDBC URL
     */
    public String buildJdbcUrl(String host, int port, String database) {
        return switch (this) {
            case ORACLE ->
                    String.format("jdbc:oracle:thin:@%s:%d:%s", host, port, database);
            case MYSQL, TIDB ->
                    String.format("jdbc:mysql://%s:%d/%s?useUnicode=true&characterEncoding=utf8&useSSL=false&serverTimezone=Asia/Shanghai",
                            host, port, database);
            case SQL_SERVER ->
                    String.format("jdbc:sqlserver://%s:%d;databaseName=%s;encrypt=false", host, port, database);
            case POSTGRESQL ->
                    String.format("jdbc:postgresql://%s:%d/%s", host, port, database);
            case DAMENG ->
                    String.format("jdbc:dm://%s:%d/%s", host, port, database);
        };
    }

    /**
     * 是否支持该数据库类型
     *
     * @param typeName 数据库类型名称
     * @return true 如果支持
     */
    public static boolean isSupported(String typeName) {
        try {
            fromName(typeName);
            return true;
        } catch (IllegalArgumentException e) {
            return false;
        }
    }
}
